using System;
using System.Linq;
using UnityEditor;
using UnityEngine;

namespace Tools.ExcelToJson.Editor
{
    public class ExcelToJsonTabWindow
    {
        private string _name;
        private readonly string _rawJson;
        private string _convertJson;
        private Vector2 _scrollPosition;

        private Type[] _jsonTypes = Array.Empty<Type>();
        private string[] _jsonTypeNames = Array.Empty<string>();
        private int _jsonTypeIndex;

        public ExcelToJsonTabWindow(string name, string rawJson)
        {
            _name = name;
            _rawJson = rawJson;
            _convertJson = _rawJson;
            OnEnable();
        }

        public void OnEnable()
        {
            var jsonTypeList = AssemblyUtils.GetAllTypes().Where(IsJsonDataType).ToList();
            jsonTypeList.Insert(0, null);
            _jsonTypes = jsonTypeList.ToArray();
            _jsonTypeNames = new string[_jsonTypes.Length + 1];
            _jsonTypeNames[0] = "None";
            for (var i = 1; i < _jsonTypes.Length; i++) 
                _jsonTypeNames[i] = _jsonTypes[i].FullName.Replace('.', '/');
            _jsonTypeIndex = 0;
        }

        private static bool IsJsonDataType(Type type)
        {
            return type.Name.EndsWith("JsonData");
        }

        public void OnGUI()
        {
            var jsonTypeIndex = EditorGUILayout.Popup("Json Object", _jsonTypeIndex, _jsonTypeNames);
            if (jsonTypeIndex != _jsonTypeIndex)
            {
                _jsonTypeIndex = jsonTypeIndex;
                OnConvert();
            }
            
            _scrollPosition = GUILayout.BeginScrollView(_scrollPosition);
            GUILayout.TextArea(_convertJson);
            GUILayout.EndScrollView();
        }

        private void OnConvert()
        {
            var curType = _jsonTypes[_jsonTypeIndex];
            if (curType == null)
                _convertJson = _rawJson;
            else
            {
                var curTypeArray = Array.CreateInstance(curType, 0).GetType();
                _convertJson = JsonUtils.ToJson(JsonUtils.FromJson(_rawJson, curTypeArray));
            }
        }
    }
}